﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using DataTier.Entities;
using BusinessLogic;

namespace DataServices
{
    [ServiceContract(Namespace = WCFSettings.Namespace)]
    [XmlSerializerFormat]
    public interface IExpendBillService
    {

        /// <summary>
        /// Возвращает список всех Расходных накладных по всем из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ExpendBillEntity> GetExpendBillAllList(int currentUserId, int numPage, int onPage, SearchParameters param = null);


        /// <summary>
        /// Возвращает количество Расходных накладных по всем заказам из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int GetExpendBillAllListCount(int currentUserId, SearchParameters param = null);


        /// <summary>
        /// Возвращает список всех Расходных накладных по конкретногму Заказу из базы данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="orderId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ExpendBillEntity> GetExpendBillList(int currentUserId, bool onlyIts, int orderId);


        /// <summary>
        /// Возвращает Расходную накладную из базы данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ExpendBillEntity GetExpendBill(int currentUserId, int id);


        /// <summary>
        /// Формируется новый объект Расходная накладная по конкретному Заказу
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="orderId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ExpendBillEntity CreateNewExpendBill(int currentUserId, int orderId);


        /// <summary>
        /// Сохранение Расходной накладной в базе данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="newExpendBill"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int SaveExpendBill(int currentUserId, ExpendBillEntity newExpendBill);


        /// <summary>
        /// Удаляются записи из Накладной
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="newExpendBillId"></param>
        /// <param name="productIDs"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void RemoveProductsFromExpendBill(int currentUserId, int newExpendBillId, int[] productIDs);


        /// <summary>
        /// Обновление количества товаров в указанных Накладных 
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="billsForModif"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void UpdateProductsFromExpendBills(int currentUserId, List<BillProductCountComposite> billsForModif);


        /// <summary>
        /// Удаление Расходной накладной
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="expendBillId"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void DeleteExpendBill(int currentUserId, int expendBillId);


        /// <summary>
        /// Обновление товаров в спецификации Накладной и связанного с ней Заказа
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="orderId"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void RefreshExpendBillSpecAndOrderSpec(int currentUserId, int expendBillId);



        /// <summary>
        /// Формирует новый консолидированный счет
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="costCenterId"></param>
        /// <param name="dateBegin"></param>
        /// <param name="dateEnd"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ConsolidatedAccountEntity CreateConsolidatedAccount(int currentUserId, int juridicalPersonId, DateTime dateBegin, DateTime dateEnd);


        /// <summary>
        /// Возвращает объект Консолидированный Счет
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="accountId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ConsolidatedAccountEntity GetConsolidatedAccount(int currentUserId, int accountId);


        /// <summary>
        /// Сохранение Консолидированного счета в базе данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="newConsolidatedAccount"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int SaveConsolidatedAccount(int currentUserId, ConsolidatedAccountEntity newConsolidatedAccount);


        /// <summary>
        /// Возвращает список Консолидированных счетов из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ConsolidatedAccountEntity> GetConsolidatedAccountList(int currentUserId, int numPage, int onPage, SearchParameters parameters = null);


        /// <summary>
        /// Возвращает количество Консолидированных счетов из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int GetConsolidatedAccountListCount(int currentUserId, SearchParameters parameters = null);










        /// <summary>
        /// Формирует новый консолидированный счет
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="costCenterId"></param>
        /// <param name="dateBegin"></param>
        /// <param name="dateEnd"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        CAEntity2 CreateConsolidatedAccount2(int currentUserId, int juridicalPersonId, DateTime dateBegin, DateTime dateEnd);


        /// <summary>
        /// Возвращает объект Консолидированный Счет
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="accountId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        CAEntity2 GetConsolidatedAccount2(int currentUserId, int accountId);


        /// <summary>
        /// Сохранение Консолидированного счета в базе данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="newConsolidatedAccount"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int SaveConsolidatedAccount2(int currentUserId, CAEntity2 newConsolidatedAccount);


        /// <summary>
        /// Возвращает список Консолидированных счетов из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<CAEntity2> GetConsolidatedAccountList2(int currentUserId, int numPage, int onPage, SearchParameters parameters = null);


        /// <summary>
        /// Возвращает количество Консолидированных счетов из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int GetConsolidatedAccountListCount2(int currentUserId, SearchParameters parameters = null);



        /// <summary>
        /// Возвращает объединенный объект для экспортной формы Отгрузка (на основании Консолидированного счета)
        /// </summary>
        /// <param name="accountId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ConsolidatedAccountOtgruzkaEntity GetConsolidatedAccountOtgruzka(int accountId);


        /// <summary>
        /// Возвращает объединенный объект для экспортной формы Накладная (на основании Консолидированного счета)
        /// </summary>
        /// <param name="accountId"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        ConsolidatedAccountInvoiceEntity GetConsolidatedAccountInvoice(int accountId);

        
    }
}
